/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.isd.ventas.web;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import org.primefaces.event.TabChangeEvent;
import com.isd.global.util.JsfUtil;
import com.isd.seguridad.web.UsuarioSessionBean;
import com.isd.venta.vista.ItemHistoricoCuentaCorriente;
import com.isd.venta.vista.ItemPendienteCuentaCorriente;
import com.isd.ventas.rn.CuentaCorrienteRN;
import javax.faces.bean.ViewScoped;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

/**
 *
 * @author Claudio
 */
@ManagedBean(name="cuentaCorrienteBean")
@ViewScoped
public class CuentaCorrienteBean implements Serializable {

    @EJB private CuentaCorrienteRN cuentaCorrienteRN;

    private Date fDesde;
    private Date fHasta;
    private Date fMinima;

    private BigDecimal saldoActual;
    private List<ItemPendienteCuentaCorriente> debitos;
    private List<ItemPendienteCuentaCorriente> creditos;
    private List<ItemHistoricoCuentaCorriente> historial;

    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean usuarioSessionBean;


    /** Creates a new instance of CuentaCorrienteBean */
    public CuentaCorrienteBean() {

    }

    @PostConstruct
    public void init(){

        fDesde = new Date();
        fHasta = new Date();
        fMinima= getFechaMinima();
        
        //Si está registrado buscamos el carrito de lo contrario vamos al catálogo
        if(usuarioSessionBean.isEstaRegistrado() && usuarioSessionBean.getUsuario().getCliente()!=null){

            saldoActual = cuentaCorrienteRN.getSaldoActual(usuarioSessionBean.getUsuario().getCliente().getNrocta());
            debitos = cuentaCorrienteRN.getDebitosPendientes(usuarioSessionBean.getUsuario().getCliente().getNrocta());
            creditos = cuentaCorrienteRN.getCreditosPendientes(usuarioSessionBean.getUsuario().getCliente().getNrocta());
            historial = new ArrayList<ItemHistoricoCuentaCorriente>();

        }else{

            if(usuarioSessionBean.getUsuario().getTipo().equals('V')){
                JsfUtil.addWarningMessage("Seleccione un cliente para ver el estado de cuenta corriente");
            }else{
                JsfUtil.addErrorMessage("No es posible procesar la inforación");
            }            
        }        
    }

    public Date getFechaMinima(){

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DAY_OF_YEAR, -730);
        return cal.getTime();
    }

    public Date getFechaMaxima(){

        return new Date();
    }

    public void consultarPendientes(){

    }

    public void consultarHistorial(){

        String nrocta = usuarioSessionBean.getUsuario().getCliente().getNrocta() ;

        if (fHasta.before(fDesde)){
            JsfUtil.addErrorMessage("Fecha desde tiene que ser mayor o igual a fecha Hasta");
            return;
        }

        historial = cuentaCorrienteRN.getHistorialEntreFechas(nrocta, fDesde, fHasta);

        if (historial.isEmpty()){
            JsfUtil.addWarningMessage("No se encontraron movimientos en el período seleccionado");
        }
        
        //Inicializamos el saldo anterior en cero
        ItemHistoricoCuentaCorriente SaldoAnterior = cuentaCorrienteRN.getSaldoAnterior(nrocta, fDesde);
        historial.add(0, SaldoAnterior);
        
        BigDecimal saldo = SaldoAnterior.getSaldo();
        for(ItemHistoricoCuentaCorriente i: historial){

            if(!i.getCodfor().equals("SA")){
                i.setSaldo(saldo.add(i.getDebe().add(i.getHaber().negate())));
                saldo = i.getSaldo();
            }
        }        
    }

    public void onTabChange(TabChangeEvent event) {

        if(event.getTab().getTitle().equals("Historial"))
            JsfUtil.addInfoMessage("Puede consultar el historial de movimientos de los ùltimos 2 años");

    }

    
    public void postProcessXLS(Object document) {
        
        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        HSSFRow header = sheet.getRow(0);
         
        HSSFCellStyle cellStyle = wb.createCellStyle();  
        cellStyle.setFillForegroundColor(HSSFColor.ORANGE.index);
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
         
        for(int i=0; i < header.getPhysicalNumberOfCells();i++) {
            HSSFCell cell = header.getCell(i);             
            cell.setCellStyle(cellStyle);
        }
    }
    
    
    public BigDecimal getSaldoActual() {
        return saldoActual;
    }

    public void setSaldoActual(BigDecimal saldoActual) {
        this.saldoActual = saldoActual;
    }

    public List<ItemPendienteCuentaCorriente> getCreditos() {
        return creditos;
    }

    public void setCreditos(List<ItemPendienteCuentaCorriente> creditos) {
        this.creditos = creditos;
    }

    public List<ItemPendienteCuentaCorriente> getDebitos() {
        return debitos;
    }

    public void setDebitos(List<ItemPendienteCuentaCorriente> debitos) {
        this.debitos = debitos;
    }


    public List<ItemHistoricoCuentaCorriente> getHistorial() {
        return historial;
    }

    public void setHistorial(List<ItemHistoricoCuentaCorriente> historial) {
        this.historial = historial;
    }
    
    public Date getfDesde() {
        return fDesde;
    }

    public void setfDesde(Date fDesde) {
        this.fDesde = fDesde;
    }

    public Date getfHasta() {
        return fHasta;
    }

    public void setfHasta(Date fHasta) {
        this.fHasta = fHasta;
    }

    public Date getfMinima() {
        return fMinima;
    }

    public void setfMinima(Date fMinima) {
        this.fMinima = fMinima;
    }

    public UsuarioSessionBean getUsuarioSessionBean() {
        return usuarioSessionBean;
    }

    public void setUsuarioSessionBean(UsuarioSessionBean usuarioSessionBean) {
        this.usuarioSessionBean = usuarioSessionBean;
    }
    
}
